﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Resources;
using System.Reflection;

namespace CreatingObjects3d
{
    public partial class formPrincipal : Form
    {
        private ContenedorProyecto datosProyecto;
        private String imagenSuperiorPanorama = "";
        private String imagenInferiorPanorama = "";
        private String imagenTraseraPanorama = "";
        private String imagenFrontalPanorama = "";
        private String imagenDerechaPanorama = "";
        private String imagenIzquierdaPanorama = "";
        private String imagenCaja = "";
        private String imagenCono = "";
        private String imagenCilindro = "";
        private String imagenEsfera = "";
        private int contadorCaja;
        private int contadorCilindro;
        private int contadorCono;
        private int contadorEsfera;
        private int contadorFichero;

        public formPrincipal()
        {
            InitializeComponent();
        }

        private void formPrincipal_Load(object sender, EventArgs e)
        {
            desactivarMenus();
            desactivarPaneles();
        }

        #region EventosDeControles;
        private void nuevoProyectoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (datosProyecto != null)
            {
                DialogResult resultado = MessageBox.Show("¿Guardar proyecto actual?", "Guardar", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (resultado == DialogResult.Yes)
                {
                    if (datosProyecto.setGuardarProyecto())
                    {
                        MessageBox.Show("Proyecto guardado.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        guardarFicheroProyecto();
                        datosProyecto.setGuardarProyecto();
                        MessageBox.Show("Proyecto guardado.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            guardarFicheroProyecto();
            datosProyecto.setGuardarProyecto();
            activarMenus();
        }

        private void abrirProyectoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (datosProyecto != null)
            {
                DialogResult resultado = MessageBox.Show("¿Guardar proyecto actual?", "Guardar", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (resultado == DialogResult.Yes)
                {
                    if (datosProyecto.setGuardarProyecto())
                    {
                        MessageBox.Show("Proyecto guardado.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        guardarFicheroProyecto();
                        MessageBox.Show("Proyecto guardado.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            if (cargarFicheroProyecto())
            {
                if (datosProyecto.getCargarProyecto())
                {
                    MessageBox.Show("Proyecto cargado correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    activarMenus();
                }
                else
                {
                    MessageBox.Show("El fichero seleccionado no es correcto.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }

        private void guardarProyectoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (datosProyecto.setGuardarProyecto())
            {
                MessageBox.Show("Proyecto guardado correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("Ha ocurrido un error al guardar el proyecto, la unidad no está disponible.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void generarFichero3DToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (datosProyecto.getGenerarFicheroWRL())
            {
                MessageBox.Show("Fichero 3D generado correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("Ha ocurrido un error al crear el fichero 3D", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (datosProyecto != null)
            {
                DialogResult resultado = MessageBox.Show("¿Guardar proyecto actual?", "Guardar", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (resultado == DialogResult.Yes)
                {
                    if (datosProyecto.setGuardarProyecto())
                    {
                        MessageBox.Show("Proyecto guardado.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        guardarFicheroProyecto();
                        MessageBox.Show("Proyecto guardado.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            Application.Exit();
        }

        private void formasToolStripMenuItem_Click(object sender, EventArgs e)
        {
            controlPestañas.Visible = true;
            controlPestañas.Enabled = true;
            labelSeleccione.Visible = true;
            // Este evento lo hago para que los check box de Color, y de rotación se inicialicen y no falle esto.
            controlPestañas_SelectedIndexChanged(controlPestañas, new EventArgs { });
        }

        private void añadirFicherosConObjetoswrlToolStripMenuItem_Click(object sender, EventArgs e)
        {
            desactivarPaneles();
            panelFicheros.Visible = true;
            panelFicheros.Enabled = true;
            cargarItemsEnLista(listaFicheros, 5);
        }

        private void cieloToolStripMenuItem_Click(object sender, EventArgs e)
        {
            desactivarPaneles();
            panelColorCielo.Enabled = true;
            panelColorCielo.Visible = true;
            if (datosProyecto.getObjeto("", 7) == null)
            {
                ObjetoCieloSuelo cieloSuelo = new ObjetoCieloSuelo(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
                datosProyecto.setIntroducirObjetos(cieloSuelo);
            }
            else
            {
                ObjetoCieloSuelo cieloSuelo = (ObjetoCieloSuelo)datosProyecto.getObjeto("", 7);
                numAnguloCielo.Value = (decimal)cieloSuelo.AnguloCielo;
                int[] colorSuperior = cieloSuelo.getColorCieloEsfera();
                int[] colorHorizonte = cieloSuelo.getColorCieloHorizonte();
                lblColorCieloSuperior.BackColor = System.Drawing.Color.FromArgb(colorSuperior[0], colorSuperior[1], colorSuperior[2]);
                lblColorCieloHorizonte.BackColor = System.Drawing.Color.FromArgb(colorHorizonte[0], colorHorizonte[1], colorHorizonte[2]);
            }
        }

        private void sueloToolStripMenuItem_Click(object sender, EventArgs e)
        {
            desactivarPaneles();
            panelColorSuelo.Enabled = true;
            panelColorSuelo.Visible = true;
            if (datosProyecto.getObjeto("", 7) == null)
            {
                ObjetoCieloSuelo cieloSuelo = new ObjetoCieloSuelo(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
                datosProyecto.setIntroducirObjetos(cieloSuelo);
            }
            else
            {
                ObjetoCieloSuelo cieloSuelo = (ObjetoCieloSuelo)datosProyecto.getObjeto("", 7);
                numAnguloColorSuelo.Value = (decimal)cieloSuelo.AnguloSuelo;
                int[] colorSuperior = cieloSuelo.getColorSueloEsfera();
                int[] colorHorizonte = cieloSuelo.getColorSueloHorizonte();
                lblColorSuelo.BackColor = System.Drawing.Color.FromArgb(colorSuperior[0], colorSuperior[1], colorSuperior[2]);
                lblColorSueloHorizonte.BackColor = System.Drawing.Color.FromArgb(colorHorizonte[0], colorHorizonte[1], colorHorizonte[2]);
            }
        }

        private void nieblaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            desactivarPaneles();
            panelNiebla.Enabled = true;
            panelNiebla.Visible = true;
            if (datosProyecto.getObjeto("", 6) == null)
            {
                rdbExponencial.Checked = true;
            }
            else
            {
                ObjetoNiebla niebla = (ObjetoNiebla)datosProyecto.getObjeto("", 6);
                numDistanciaNiebla.Value = (decimal)niebla.Visibilidad;
                int[] color = niebla.getColor();
                lblColorNiebla.BackColor = System.Drawing.Color.FromArgb(color[0], color[1], color[2]);
                if (niebla.TipoNiebla == 'E')
                {
                    rdbExponencial.Checked = true;
                }
                else
                {
                    rdbLineal.Checked = true;
                }
            }
        }

        private void panoramaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            desactivarPaneles();
            panelPanorama.Enabled = true;
            panelPanorama.Visible = true;
            try
            {
                if (datosProyecto.getObjeto("", 8) != null)
                {
                    ObjetoPanorama panorama = (ObjetoPanorama)datosProyecto.getObjeto("", 8);
                    Image imagen;
                    if (panorama.ImagenTrasera != "")
                    {
                        imagenTraseraPanorama = panorama.ImagenTrasera;
                        imagen = new Bitmap(Image.FromFile(imagenTraseraPanorama), 150, 150);
                        lblImagenTraseraPanorama.Image = imagen;
                    }
                    if (panorama.ImagenFrontal != "")
                    {
                        imagenFrontalPanorama = panorama.ImagenFrontal;
                        imagen = new Bitmap(Image.FromFile(imagenFrontalPanorama), 150, 150);
                        lblImagenFrontalPanorama.Image = imagen;
                    }
                    if (panorama.ImagenArriba != "")
                    {
                        imagenSuperiorPanorama = panorama.ImagenArriba;
                        imagen = new Bitmap(Image.FromFile(imagenSuperiorPanorama), 150, 150);
                        lblImagenSuperiorPanorama.Image = imagen;
                    }
                    if (panorama.ImagenAbajo != "")
                    {
                        imagenInferiorPanorama = panorama.ImagenAbajo;
                        imagen = new Bitmap(Image.FromFile(imagenInferiorPanorama), 150, 150);
                        lblImagenInferiorPanorama.Image = imagen;
                    }
                    if (panorama.ImagenDerecha != "")
                    {
                        imagenDerechaPanorama = panorama.ImagenDerecha;
                        imagen = new Bitmap(Image.FromFile(imagenDerechaPanorama), 150, 150);
                        lblImagenDerechaPanorama.Image = imagen;
                    }
                    if (panorama.ImagenIzquierda != "")
                    {
                        imagenIzquierdaPanorama = panorama.ImagenIzquierda;
                        imagen = new Bitmap(Image.FromFile(imagenIzquierdaPanorama), 150, 150);
                        lblImagenIzquierdaPanorama.Image = imagen;
                    }
                }
            }
            catch
            {
            }
        }

        private void previsualizarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (datosProyecto.getArrayObjetos().Count > 0)
            {
                if (System.IO.Directory.Exists("C:\\Program Files\\Media Machines\\Flux") || System.IO.Directory.Exists("D:\\Program Files\\Media Machines\\Flux"))
                {
                    String fichero = datosProyecto.FicheroProyecto.Substring(0, datosProyecto.FicheroProyecto.Length - 4);
                    fichero += ".wrl";
                    datosProyecto.getGenerarFicheroWRL();
                    if (System.IO.Directory.Exists("C:\\Program Files\\Media Machines\\Flux"))
                    {
                        String directorio = "C:\\Program Files\\Media Machines\\Flux\\" ;
                        System.Diagnostics.Process MyProceso = new System.Diagnostics.Process();
                        MyProceso.StartInfo.WorkingDirectory = directorio;
                        MyProceso.StartInfo.FileName = "FluxPlayer.exe";
                        MyProceso.StartInfo.Arguments = fichero;
                        MyProceso.Start();
                    }
                    else
                    {
                        String directorio = "D:\\Program Files\\Media Machines\\Flux\\";
                        System.Diagnostics.Process MyProceso = new System.Diagnostics.Process();
                        MyProceso.StartInfo.WorkingDirectory = directorio;
                        MyProceso.StartInfo.FileName = "FluxPlayer.exe";
                        MyProceso.StartInfo.Arguments = fichero;
                        MyProceso.Start();
                    }
                }
                else
                {
                    DialogResult boton =  MessageBox.Show("Su equipo no tiene instalado el visor FluxPlayer. ¿Desea que sea instalado en su equipo?", "FluxPlayer no encontrado", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                    if (boton == DialogResult.Yes)
                    {
                        try
                        {
                            instalarFlux();
                        }
                        catch
                        {
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("No hay objetos para previsualizar.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        #endregion

        #region metodosDelFormulario

        private void guardarFicheroProyecto()
        {
            Boolean ficheroCorrecto = false;
            while (!ficheroCorrecto)
            {
                saveFileDialog1.InitialDirectory = "C:";
                saveFileDialog1.Filter = "Ficheros DAT|*.dat";
                saveFileDialog1.ShowDialog();
                if (saveFileDialog1.FileName == "")
                {
                    MessageBox.Show("Hay que introducir un fichero para el proyecto.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                else
                {
                    datosProyecto = new ContenedorProyecto();
                    datosProyecto.FicheroProyecto = saveFileDialog1.FileName;
                    ficheroCorrecto = true;
                }
            }
        }

        private Boolean cargarFicheroProyecto()
        {
            openFileDialog1.InitialDirectory = "C:";
            openFileDialog1.Filter = "Ficheros DAT|*.dat";
            openFileDialog1.ShowDialog();
            if (openFileDialog1.FileName != "" && openFileDialog1.FileName != "openFileDialog1")
            {
                datosProyecto = new ContenedorProyecto();
                datosProyecto.FicheroProyecto = openFileDialog1.FileName;
                return true;
            }
            return false;
        }

        private void desactivarMenus()
        {
            guardarProyectoToolStripMenuItem.Enabled = false;
            formasToolStripMenuItem.Enabled = false;
            formatoToolStripMenuItem.Enabled = false;
            proyectoToolStripMenuItem.Enabled = false;
        }

        private void desactivarPaneles()
        {
            controlPestañas.Visible = false;
            controlPestañas.Enabled = false;
            labelSeleccione.Visible = false;

            panelFicheros.Visible = false;
            panelFicheros.Enabled = false;

            panelColorCielo.Visible = false;
            panelColorCielo.Enabled = false;

            panelColorSuelo.Visible = false;
            panelColorSuelo.Enabled = false;

            panelNiebla.Visible = false;
            panelNiebla.Enabled = false;

            panelPanorama.Visible = false;
            panelPanorama.Enabled = false;
        }

        private void activarMenus()
        {
            guardarProyectoToolStripMenuItem.Enabled = true;
            formasToolStripMenuItem.Enabled = true;
            formatoToolStripMenuItem.Enabled = true;
            proyectoToolStripMenuItem.Enabled = true;
        }

        /// <summary>
        /// Carga los datos de los objetos en un ListView. Hay que indicar para el filtrado el tipo de objeto.
        /// Tipos por numeración: 1-Caja, 2-Cilindro, 3-Cono, 4-Esfera, 5-FicheroExterno.
        /// </summary>
        /// <param name="lista"></param>
        /// <param name="tipoObjeto"></param>
        private void cargarItemsEnLista(ListView lista, int tipoObjeto)
        {
            lista.Items.Clear(); //Borramos los objetos de la lista porque sino se repiten al introducir más
            ArrayList objetos = datosProyecto.getObjeto(tipoObjeto);
            switch (tipoObjeto)
            {
                case 1:
                    for (int i = 0; i < objetos.Count; i++)
                    {
                        ObjetoCaja objeto = (ObjetoCaja)objetos[i];
                        ListViewItem lvi = new ListViewItem(new[] { i + 1 + "", objeto.NombreObjeto, "Caja" });
                        lista.Items.Add(lvi);
                    }
                    break;
                case 2:
                    for (int i = 0; i < objetos.Count; i++)
                    {
                        ObjetoCilindro objeto = (ObjetoCilindro)objetos[i];
                        ListViewItem lvi = new ListViewItem(new[] { i + 1 + "", objeto.NombreObjeto, "Cilindro" });
                        lista.Items.Add(lvi);
                    }
                    break;
                case 3:
                    for (int i = 0; i < objetos.Count; i++)
                    {
                        ObjetoCono objeto = (ObjetoCono)objetos[i];
                        ListViewItem lvi = new ListViewItem(new[] { i + 1 + "", objeto.NombreObjeto, "Cono" });
                        lista.Items.Add(lvi);
                    }
                    break;
                case 4:
                    for (int i = 0; i < objetos.Count; i++)
                    {
                        ObjetoEsfera objeto = (ObjetoEsfera)objetos[i];
                        ListViewItem lvi = new ListViewItem(new[] { i + 1 + "", objeto.NombreObjeto, "Esfera" });
                        lista.Items.Add(lvi);
                    }
                    break;
                case 5:
                    for (int i = 0; i < objetos.Count; i++)
                    {
                        ObjetoFicheroExterno objeto = (ObjetoFicheroExterno)objetos[i];
                        ListViewItem lvi = new ListViewItem(new[] { i + 1 + "", objeto.NombreObjeto, objeto.RutaFichero });
                        lista.Items.Add(lvi);
                    }
                    break;
            }
        }

        private String cargarImagen()
        {
            openFileDialog1.InitialDirectory = "C:";
            openFileDialog1.Filter = "Ficheros JPG|*.jpg";
            openFileDialog1.ShowDialog();
            return openFileDialog1.FileName;
        }

        private void instalarFlux()
        {
            byte[] arrayByte = CreatingObjects3d.Properties.Resources.SetupFlux;
            FileStream archivoSalida = new FileStream(Application.StartupPath + "\\flux.exe", FileMode.Create);
            archivoSalida.Write(arrayByte, 0, arrayByte.Length);
            archivoSalida.Close();
            String directorio = Application.StartupPath;
            System.Diagnostics.Process MyProceso = new System.Diagnostics.Process();
            MyProceso.StartInfo.WorkingDirectory = directorio;
            MyProceso.StartInfo.FileName = "flux.exe";            
            MyProceso.Start(); 
        }

        #endregion

        #region eventosPestañaCaja
        private void controlPestañas_SelectedIndexChanged(object sender, EventArgs e)
        {
            TabControl tc = (TabControl)sender;
            switch (tc.SelectedTab.Text)
            {
                case "Caja":
                    opcionColorCaja.Checked = true;
                    rotacionXCaja.Checked = true;
                    limpiarPestañaCaja();
                    cargarItemsEnListaCaja();
                    break;
                case "Cilindro":
                    opcionColorCilindro.Checked = true;
                    rotacionXCilindro.Checked = true;
                    limpiarPestañaCilindro();
                    cargarItemsEnListaCilindro();
                    break;
                case "Cono":
                    opcionColorCono.Checked = true;
                    rotacionXCono.Checked = true;
                    limpiarPestañaCono();
                    cargarItemsEnListaCono();
                    break;
                case "Esfera":
                    opcionColorEsfera.Checked = true;
                    rotacionXEsfera.Checked = true;
                    limpiarPestañaEsfera();
                    cargarItemsEnListaEsfera();
                    break;                
            }
        }

        private void opcionColorCaja_CheckedChanged(object sender, EventArgs e)
        {
            if (opcionColorCaja.Checked)
            {
                tbImagenCaja.Visible = false;
                btnExaminarCaja.Visible = false;
                btnColorCaja.Visible = true;
                lblColorCaja.Visible = true;
                lblImagenCaja.Visible = false;
                lblColorInteriorCaja.Visible = true;
                lblColorReflejadoCaja.Visible = true;
                btnColorObjetoCaja.Visible = true;
                btnColorInteriorCaja.Visible = true;
                lblReflejoLuzCaja.Visible = true;
                lblBrilloCaja.Visible = true;
                numReflejoLuzCaja.Visible = true;
                numBrilloCaja.Visible = true;
                tbImagenCaja.Text = "";                
            }
            else
            {
                tbImagenCaja.Visible = true;
                btnExaminarCaja.Visible = true;
                btnColorCaja.Visible = false;
                lblColorCaja.Visible = false;
                lblImagenCaja.Visible = true;
                lblColorInteriorCaja.Visible = false;
                lblColorReflejadoCaja.Visible = false;
                btnColorObjetoCaja.Visible = false;
                btnColorInteriorCaja.Visible = false;
                lblReflejoLuzCaja.Visible = false;
                lblBrilloCaja.Visible = false;
                numReflejoLuzCaja.Visible = false;
                numBrilloCaja.Visible = false;
                tbImagenCaja.Text = imagenCaja;
                try
                {
                    Bitmap imagen = new Bitmap(Image.FromFile(imagenCaja), 126, 126);
                    lblImagenCaja.Image = imagen;
                }
                catch
                {
                }
            }
        }

        private void cargarItemsEnListaCaja()
        {
            //ListViewItem lvi = new ListViewItem(new[] { "1", "prueba", "caja" });
            //listaObjetosCaja.Items.Add(lvi);            
            listaObjetosCaja.Items.Clear();
            ArrayList objetos = datosProyecto.getObjeto(1);
            for (int i = 0; i < objetos.Count; i++)
            {
                ObjetoCaja oc = (ObjetoCaja)objetos[i];
                ListViewItem lvi = new ListViewItem(new[] { i + 1 + "", oc.NombreObjeto, "Caja" });
                listaObjetosCaja.Items.Add(lvi);
            }
        }

        private void limpiarPestañaCaja()
        {
            tbNombreCaja.Text = "";
            numAnchoCaja.Value = numAltoCaja.Value = numProfundidadCaja.Value = numPosXCaja.Value = numPosYCaja.Value = numPosZCaja.Value = numRotacionCaja.Value = 0;
            numReflejoLuzCaja.Value = numBrilloCaja.Value = numTransparenciaCaja.Value = 0;
            lblColorCaja.BackColor = lblColorInteriorCaja.BackColor = lblColorReflejadoCaja.BackColor = lblImagenCaja.BackColor = Color.Transparent;
            lblImagenCaja.Image = null;
            tbImagenCaja.Text = "";
        }

        private void btnModificarCaja_Click(object sender, EventArgs e)
        {
            if (tbNombreCaja.Text != "")
            {
                btnInsertarCaja.PerformClick();
            }            
        }

        private void btnEliminarCaja_Click(object sender, EventArgs e)
        {
            ObjetoCaja ocNuevo = (ObjetoCaja)datosProyecto.getObjeto(tbNombreCaja.Text, 1);
            if (ocNuevo != null)
            {
                datosProyecto.setBorrarObjetoArray(tbNombreCaja.Text, 1);
                cargarItemsEnListaCaja();
                limpiarPestañaCaja();
            }
        }

        private void btnInsertarCaja_Click(object sender, EventArgs e)
        {
            //Aquí no se que controlar para cuando presione insertar que se genere, porque son muchos campos...
            Boolean nuevo = true;
            ObjetoCaja oc;
            if (tbNombreCaja.Text != "")
            {
                oc = (ObjetoCaja)datosProyecto.getObjeto(tbNombreCaja.Text, 1);
                if (oc != null)
                {                    
                    nuevo = false;
                }
                else
                {
                    oc = new ObjetoCaja(decimal.ToSingle(numAnchoCaja.Value), decimal.ToSingle(numAltoCaja.Value), decimal.ToSingle(numProfundidadCaja.Value), contadorCaja);
                    oc.NombreObjeto = tbNombreCaja.Text;
                    contadorCaja++;
                }
            }
            else
            {
                oc = new ObjetoCaja(decimal.ToSingle(numAnchoCaja.Value), decimal.ToSingle(numAltoCaja.Value), decimal.ToSingle(numProfundidadCaja.Value), contadorCaja);
                contadorCaja++;
            }
            if(!nuevo)
            {
                oc.setMedidas(decimal.ToSingle(numAnchoCaja.Value), decimal.ToSingle(numAltoCaja.Value), decimal.ToSingle(numProfundidadCaja.Value));
            }
            oc.setPosicion(decimal.ToSingle(numPosXCaja.Value), decimal.ToSingle(numPosYCaja.Value), decimal.ToSingle(numPosZCaja.Value));
            if (rotacionXCaja.Checked)
            {
                oc.EjeDeRotacion = 'X';
            }
            else if (rotacionYCaja.Checked)
            {
                oc.EjeDeRotacion = 'Y';
            }
            else if (rotacionZCaja.Checked)
            {
                oc.EjeDeRotacion = 'Z';
            }
            oc.AnguloRotacion = decimal.ToSingle(numRotacionCaja.Value);
            oc.setEscala(decimal.ToSingle(numEscalaXCaja.Value), decimal.ToSingle(numEscalaYCaja.Value), decimal.ToSingle(numEscalaZCaja.Value));
            if (opcionColorCaja.Checked)
            {
                oc.setColorObjeto(colorObjeto.R, colorObjeto.G, colorObjeto.B);
                oc.setColorReflejado(colorReflejado.R, colorReflejado.G, colorReflejado.B);
                oc.setColorInterior(colorInterior.R, colorInterior.G, colorInterior.B);
                oc.Imagen = "";
                imagenCaja = "";
            }
            else if (opcionImagenCaja.Checked)
            {
                oc.Imagen = tbImagenCaja.Text;
            }
            oc.ReflejoLuz = decimal.ToSingle(numReflejoLuzCaja.Value);
            oc.Brillo = decimal.ToSingle(numBrilloCaja.Value);
            oc.Transparencia = decimal.ToSingle(numTransparenciaCaja.Value);
            if (nuevo)
            {
                datosProyecto.setIntroducirObjetos(oc);
            }
            cargarItemsEnListaCaja();
            limpiarPestañaCaja();                        
        }


        //Botones color
        // Voy a hacer la comida y tal, a ver si luego me pongo e implemento esto, me hacen falta unas variables mateo para el color
        // asi que ponlas globales para luego insertarlas.
        private Color colorObjeto;
        private Color colorInterior;
        private Color colorReflejado;
        private void btnColorCaja_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorObjeto = new Color();
                colorObjeto = colorDialog1.Color;
                lblColorCaja.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorObjeto != null)
                {
                    lblColorCaja.BackColor = colorObjeto;
                }
                else
                {
                    lblColorCaja.BackColor = Color.White;
                }
            }
        }

        private void btnColorInteriorCaja_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorInterior = new Color();
                colorInterior = colorDialog1.Color;
                lblColorInteriorCaja.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorInterior != null)
                {
                    lblColorInteriorCaja.BackColor = colorInterior;
                }
                else
                {
                    lblColorInteriorCaja.BackColor = Color.White;
                }
            }
        }

        private void btnColorObjetoCaja_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorReflejado = new Color();
                colorReflejado = colorDialog1.Color;
                lblColorReflejadoCaja.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorReflejado != null)
                {
                    lblColorReflejadoCaja.BackColor = colorReflejado;
                }
                else
                {
                    lblColorReflejadoCaja.BackColor = Color.White;
                }
            }
        }

        //Boton Imagen
        private void btnExaminarCaja_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Ficheros JPG|*.jpg";
            openFileDialog1.ShowDialog();
            if (openFileDialog1.FileName != "")
            {
                try
                {
                    // Si queremos, se pueden redimensionar las imagenes a lo que nosotros digamos.
                    Bitmap imagen = new Bitmap(Image.FromFile(openFileDialog1.FileName), 126, 126);
                    lblImagenCaja.Image = imagen;
                    tbImagenCaja.Text = openFileDialog1.FileName;
                    imagenCaja = openFileDialog1.FileName;
                }
                catch
                {                    
                }
            }
        }       

        private void listaObjetosCaja_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                tbNombreCaja.Text = listaObjetosCaja.SelectedItems[0].SubItems[1].Text;
                ObjetoCaja objeto = (ObjetoCaja)datosProyecto.getObjeto(listaObjetosCaja.SelectedItems[0].SubItems[1].Text, 1);
                float[] medidas = objeto.getMedidas();
                numAnchoCaja.Value = (decimal)medidas[0];
                numAltoCaja.Value = (decimal)medidas[1];
                numProfundidadCaja.Value = (decimal)medidas[2];
                medidas = objeto.getPosicion();
                numPosXCaja.Value = (decimal)medidas[0];
                numPosYCaja.Value = (decimal)medidas[1];
                numPosZCaja.Value = (decimal)medidas[2];
                switch (objeto.EjeDeRotacion)
                {
                    case 'X':
                        rotacionXCaja.Checked = true;
                        break;
                    case 'Y':
                        rotacionYCaja.Checked = true;
                        break;
                    case 'Z':
                        rotacionZCaja.Checked = true;
                        break;
                }
                numRotacionCaja.Value = (decimal)objeto.AnguloRotacion;
                medidas = objeto.getEscala();
                numEscalaXCaja.Value = (decimal)medidas[0];
                numEscalaYCaja.Value = (decimal)medidas[1];
                numEscalaZCaja.Value = (decimal)medidas[2];
                if (!objeto.Imagen.Equals(""))
                {
                    opcionImagenCaja.Checked = true;
                    tbImagenCaja.Text = objeto.Imagen;
                    Bitmap imagen = new Bitmap(Image.FromFile(objeto.Imagen), 126, 126);
                    lblImagenCaja.Image = imagen;
                    imagenCaja = objeto.Imagen; ;
                }
                else
                {
                    opcionColorCaja.Checked = true;
                    int[] colores = objeto.getColorObjeto();
                    Color colorObjeto = Color.FromArgb(colores[0], colores[1], colores[2]);
                    colores = objeto.getColorInterior();
                    Color colorInterior = Color.FromArgb(colores[0], colores[1], colores[2]);
                    colores = objeto.getColorReflejado();
                    Color colorReflejado = Color.FromArgb(colores[0], colores[1], colores[2]);
                    lblColorCaja.BackColor = colorObjeto;
                    lblColorInteriorCaja.BackColor = colorInterior;
                    lblColorReflejadoCaja.BackColor = colorReflejado;
                }
                numReflejoLuzCaja.Value = (decimal)objeto.ReflejoLuz;
                numBrilloCaja.Value = (decimal)objeto.Brillo;
                numTransparenciaCaja.Value = (decimal)objeto.Transparencia;
            }
            catch
            {
            }
        }

        private void btnLimpiarCamposCaja_Click(object sender, EventArgs e)
        {
            limpiarPestañaCaja();
        }
        #endregion

        #region eventosPestañaCilindro
        private void opcionColorCilindro_CheckedChanged(object sender, EventArgs e)
        {
            if (opcionColorCilindro.Checked)
            {
                tbImagenCilindro.Visible = false;
                btnExaminarCilindro.Visible = false;
                btnColorCilindro.Visible = true;
                lblColorCilindro.Visible = true;
                lblImagenCilindro.Visible = false;
                lblColorInteriorCilindro.Visible = true;
                lblColorReflejadoCilindro.Visible = true;
                btnColorObjetoCilindro.Visible = true;
                btnColorInteriorCilindro.Visible = true;
                lblReflejoLuzCilindro.Visible = true;
                lblBrilloCilindro.Visible = true;
                numReflejoLuzCilindro.Visible = true;
                numBrilloCilindro.Visible = true;
            }
            else
            {
                tbImagenCilindro.Visible = true;
                btnExaminarCilindro.Visible = true;
                btnColorCilindro.Visible = false;
                lblColorCilindro.Visible = false;
                lblImagenCilindro.Visible = true;
                lblColorInteriorCilindro.Visible = false;
                lblColorReflejadoCilindro.Visible = false;
                btnColorObjetoCilindro.Visible = false;
                btnColorInteriorCilindro.Visible = false;
                lblReflejoLuzCilindro.Visible = false;
                lblBrilloCilindro.Visible = false;
                numReflejoLuzCilindro.Visible = false;
                numBrilloCilindro.Visible = false;
                tbImagenCilindro.Text = imagenCilindro;
                try
                {
                    Bitmap imagen = new Bitmap(Image.FromFile(imagenCilindro), 126, 126);
                    lblImagenCilindro.Image = imagen;
                }
                catch
                {
                }
            }
        }

        private void cargarItemsEnListaCilindro()
        {
            //ListViewItem lvi = new ListViewItem(new[] { "1", "prueba", "caja" });
            //listaObjetosCaja.Items.Add(lvi);            
            listaObjetosCilindro.Items.Clear();
            ArrayList objetos = datosProyecto.getObjeto(2);
            for (int i = 0; i < objetos.Count; i++)
            {
                ObjetoCilindro oc = (ObjetoCilindro)objetos[i];
                ListViewItem lvi = new ListViewItem(new[] { i + 1 + "", oc.NombreObjeto, "Cilindro" });
                listaObjetosCilindro.Items.Add(lvi);
            }
        }

        private void limpiarPestañaCilindro()
        {
            tbNombreCilindro.Text = "";
            numRadioCilindro.Value = numAltoCilindro.Value = numPosXCilindro.Value = numPosYCilindro.Value = numPosZCilindro.Value = numRotacionCilindro.Value = 0;
            numReflejoLuzCilindro.Value = numBrilloCilindro.Value = numTransparenciaCilindro.Value = 0;
            lblColorCilindro.BackColor = lblColorInteriorCilindro.BackColor = lblColorReflejadoCilindro.BackColor = lblImagenCilindro.BackColor = Color.Transparent;
            lblImagenCilindro.Image = null;
            rbParteInferiorCilindroS.Checked = rbParteLateralCilindroS.Checked = rbParteSuperiorCilindroS.Checked = true;            
        }

        private void btnModificarCindro_Click(object sender, EventArgs e)
        {
            if (tbNombreCilindro.Text != "")
            {
                btnInsertarCilindro.PerformClick();
            }
        }

        private void btnEliminarCilindro_Click(object sender, EventArgs e)
        {
            ObjetoCilindro ocNuevo = (ObjetoCilindro)datosProyecto.getObjeto(tbNombreCilindro.Text, 2);
            if (ocNuevo != null)
            {
                datosProyecto.setBorrarObjetoArray(tbNombreCilindro.Text, 2);
                cargarItemsEnListaCilindro();
                limpiarPestañaCilindro();
            }
        }

        private void btnInsertarCilindro_Click(object sender, EventArgs e)
        {
            Boolean nuevo = true;
            ObjetoCilindro oc;
            if (tbNombreCilindro.Text != "")
            {
                oc = (ObjetoCilindro)datosProyecto.getObjeto(tbNombreCilindro.Text, 2);
                if (oc != null)
                {                    
                    nuevo = false;
                }
                else
                {
                    oc = new ObjetoCilindro(decimal.ToSingle(numAltoCilindro.Value), decimal.ToSingle(numRadioCilindro.Value), contadorCilindro);
                    contadorCilindro++;
                    oc.NombreObjeto = tbNombreCilindro.Text;
                }
            }
            else
            {
                oc = new ObjetoCilindro(decimal.ToSingle(numAltoCilindro.Value), decimal.ToSingle(numRadioCilindro.Value), contadorCilindro);
                contadorCilindro++;
            }
            oc.Altura = decimal.ToSingle(numAltoCilindro.Value);
            oc.Radio = decimal.ToSingle(numRadioCilindro.Value);
            if (rbParteInferiorCilindroS.Checked)
            {
                oc.VisibilidadParteInferior = true;
            }
            else
            {
                oc.VisibilidadParteInferior = false;
            }
            if (rbParteLateralCilindroS.Checked)
            {
                oc.VisibilidadParteLateral = true;
            }
            else
            {
                oc.VisibilidadParteLateral = false;
            }
            if (rbParteSuperiorCilindroS.Checked)
            {
                oc.VisibilidadParteSuperior = true;
            }
            else
            {
                oc.VisibilidadParteSuperior = false;
            }

            oc.setPosicion(decimal.ToSingle(numPosXCilindro.Value), decimal.ToSingle(numPosYCilindro.Value), decimal.ToSingle(numPosZCilindro.Value));

            if (rotacionXCilindro.Checked)
            {
                oc.EjeDeRotacion = 'X';
            }
            else if (rotacionYCilindro.Checked)
            {
                oc.EjeDeRotacion = 'Y';
            }
            else if (rotacionZCilindro.Checked)
            {
                oc.EjeDeRotacion = 'Z';
            }
            oc.AnguloRotacion = decimal.ToSingle(numRotacionCilindro.Value);
            oc.setEscala(decimal.ToSingle(numEscalaXCilindro.Value), decimal.ToSingle(numEscalaYCilindro.Value), decimal.ToSingle(numEscalaZCilindro.Value));
            if (opcionColorCilindro.Checked)
            {
                oc.setColorObjeto(colorObjeto.R, colorObjeto.G, colorObjeto.B);
                oc.setColorReflejado(colorReflejado.R, colorReflejado.G, colorReflejado.B);
                oc.setColorInterior(colorInterior.R, colorInterior.G, colorInterior.B);
                oc.Imagen = "";
                imagenCilindro = "";
            }
            else if (opcionImagenCilindro.Checked)
            {
                oc.Imagen = tbImagenCilindro.Text;
            }
            oc.ReflejoLuz = decimal.ToSingle(numReflejoLuzCilindro.Value);
            oc.Brillo = decimal.ToSingle(numBrilloCilindro.Value);
            oc.Transparencia = decimal.ToSingle(numTransparenciaCilindro.Value);
            if (nuevo)
            {
                datosProyecto.setIntroducirObjetos(oc);
            }
            cargarItemsEnListaCilindro();
            limpiarPestañaCilindro();
            TabControl tc = controlPestañas;            
        }

        //Botones color
        // Voy a hacer la comida y tal, a ver si luego me pongo e implemento esto, me hacen falta unas variables mateo para el color
        // asi que ponlas globales para luego insertarlas.
        private void btnColorCilindro_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorObjeto = new Color();
                colorObjeto = colorDialog1.Color;
                lblColorCilindro.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorObjeto != null)
                {
                    lblColorCilindro.BackColor = colorObjeto;
                }
                else
                {
                    lblColorCilindro.BackColor = Color.White;
                }
            }
        }

        private void btnColorInteriorCilindro_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorInterior = new Color();
                colorInterior = colorDialog1.Color;
                lblColorInteriorCilindro.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorInterior != null)
                {
                    lblColorInteriorCilindro.BackColor = colorInterior;
                }
                else
                {
                    lblColorInteriorCilindro.BackColor = Color.White;
                }
            }
        }

        private void btnColorObjetoCilindro_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorReflejado = new Color();
                colorReflejado = colorDialog1.Color;
                lblColorReflejadoCilindro.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorReflejado != null)
                {
                    lblColorReflejadoCilindro.BackColor = colorReflejado;
                }
                else
                {
                    lblColorReflejadoCilindro.BackColor = Color.White;
                }
            }
        }

        //Boton Imagen
        private void btnExaminarCilindro_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Ficheros JPG|*.jpg";
            openFileDialog1.ShowDialog();
            if (openFileDialog1.FileName != "")
            {
                try
                {
                    // Si queremos, se pueden redimensionar las imagenes a lo que nosotros digamos.
                    Bitmap imagen = new Bitmap(Image.FromFile(openFileDialog1.FileName), 126, 126);
                    lblImagenCilindro.Image = imagen;
                    tbImagenCilindro.Text = openFileDialog1.FileName;
                    imagenCilindro = openFileDialog1.FileName;
                }
                catch
                {
                    lblImagenCilindro.Text = "Error al cargar la imagen.";
                }
            }
        }       

        private void listaObjetosCilindro_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                tbNombreCilindro.Text = listaObjetosCilindro.SelectedItems[0].SubItems[1].Text;
                ObjetoCilindro objeto = (ObjetoCilindro)datosProyecto.getObjeto(listaObjetosCilindro.SelectedItems[0].SubItems[1].Text, 2);
                numAltoCilindro.Value = (decimal)objeto.Altura;
                numRadioCilindro.Value = (decimal)objeto.Radio;
                if (objeto.VisibilidadParteInferior)
                {
                    rbParteInferiorCilindroS.Checked = true;
                }
                else
                {
                    rbParteInferiorCilindroN.Checked = true;
                }
                if (objeto.VisibilidadParteLateral)
                {
                    rbParteLateralCilindroS.Checked = true;
                }
                else
                {
                    rbParteLateralCilindroN.Checked = true;
                }
                if (objeto.VisibilidadParteSuperior)
                {
                    rbParteSuperiorCilindroS.Checked = true;
                }
                else
                {
                    rbParteSuperiorCilindroN.Checked = true;
                }
                float[] medidas = objeto.getPosicion();
                numPosXCilindro.Value = (decimal)medidas[0];
                numPosYCilindro.Value = (decimal)medidas[1];
                numPosZCilindro.Value = (decimal)medidas[2];
                switch (objeto.EjeDeRotacion)
                {
                    case 'X':
                        rotacionXCilindro.Checked = true;
                        break;
                    case 'Y':
                        rotacionYCilindro.Checked = true;
                        break;
                    case 'Z':
                        rotacionZCilindro.Checked = true;
                        break;
                }
                numRotacionCilindro.Value = (decimal)objeto.AnguloRotacion;
                medidas = objeto.getEscala();
                numEscalaXCilindro.Value = (decimal)medidas[0];
                numEscalaYCilindro.Value = (decimal)medidas[1];
                numEscalaZCilindro.Value = (decimal)medidas[2];
                if (!objeto.Imagen.Equals(""))
                {
                    opcionImagenCilindro.Checked = true;
                    tbImagenCilindro.Text = objeto.Imagen;
                    Bitmap imagen = new Bitmap(Image.FromFile(tbImagenCilindro.Text), 126, 126);
                    lblImagenCilindro.Image = imagen;
                    imagenCilindro = objeto.Imagen;
                }
                else
                {
                    opcionColorCilindro.Checked = true;
                    int[] colores = objeto.getColorObjeto();
                    Color colorObjeto = Color.FromArgb(colores[0], colores[1], colores[2]);
                    colores = objeto.getColorInterior();
                    Color colorInterior = Color.FromArgb(colores[0], colores[1], colores[2]);
                    colores = objeto.getColorReflejado();
                    Color colorReflejado = Color.FromArgb(colores[0], colores[1], colores[2]);
                    lblColorCilindro.BackColor = colorObjeto;
                    lblColorInteriorCilindro.BackColor = colorInterior;
                    lblColorReflejadoCilindro.BackColor = colorReflejado;
                }
                numReflejoLuzCilindro.Value = (decimal)objeto.ReflejoLuz;
                numBrilloCilindro.Value = (decimal)objeto.Brillo;
                numTransparenciaCilindro.Value = (decimal)objeto.Transparencia;
            }
            catch
            {
            }
        }

        private void btnLimpiarCamposCilindro_Click(object sender, EventArgs e)
        {
            limpiarPestañaCilindro();
        }
        #endregion

        #region eventosPestañaCono
        private void opcionColorCono_CheckedChanged(object sender, EventArgs e)
        {
            if (opcionColorCono.Checked)
            {
                tbImagenCono.Visible = false;
                btnExaminarCono.Visible = false;
                btnColorCono.Visible = true;
                lblColorCono.Visible = true;
                lblImagenCono.Visible = false;
                lblColorInteriorCono.Visible = true;
                lblColorReflejadoCono.Visible = true;
                btnColorObjetoCono.Visible = true;
                btnColorInteriorCono.Visible = true;
                lblReflejoLuzCono.Visible = true;
                lblBrilloCono.Visible = true;
                numReflejoLuzCono.Visible = true;
                numBrilloCono.Visible = true;
            }
            else
            {
                tbImagenCono.Visible = true;
                btnExaminarCono.Visible = true;
                btnColorCono.Visible = false;
                lblColorCono.Visible = false;
                lblImagenCono.Visible = true;
                lblColorInteriorCono.Visible = false;
                lblColorReflejadoCono.Visible = false;
                btnColorObjetoCono.Visible = false;
                btnColorInteriorCono.Visible = false;
                lblReflejoLuzCono.Visible = false;
                lblBrilloCono.Visible = false;
                numReflejoLuzCono.Visible = false;
                numBrilloCono.Visible = false;
                tbImagenCono.Text = imagenCono;
                try
                {
                    Bitmap imagen = new Bitmap(Image.FromFile(imagenCono), 126, 126);
                    lblImagenCono.Image = imagen;
                }
                catch
                {
                }
            }
        }

        private void cargarItemsEnListaCono()
        {
            //ListViewItem lvi = new ListViewItem(new[] { "1", "prueba", "Cono" });
            //listaObjetosCono.Items.Add(lvi);            
            listaObjetosCono.Items.Clear();
            ArrayList objetos = datosProyecto.getObjeto(3);
            for (int i = 0; i < objetos.Count; i++)
            {
                ObjetoCono oc = (ObjetoCono)objetos[i];
                ListViewItem lvi = new ListViewItem(new[] { i + 1 + "", oc.NombreObjeto, "Cono" });
                listaObjetosCono.Items.Add(lvi);
            }
        }

        private void limpiarPestañaCono()
        {
            tbNombreCono.Text = "";
            numRadioCono.Value = numAltoCono.Value = numPosXCono.Value = numPosYCono.Value = numPosZCono.Value = numRotacionCono.Value = 0;
            numReflejoLuzCono.Value = numBrilloCono.Value = numTransparenciaCono.Value = 0;
            lblColorCono.BackColor = lblColorInteriorCono.BackColor = lblColorReflejadoCono.BackColor = lblImagenCono.BackColor = Color.Transparent;
            lblImagenCono.Image = null;
            rbParteInferiorConoS.Checked = rbParteLateralConoS.Checked = true;
        }

        private void btnModificarCono_Click(object sender, EventArgs e)
        {
            if (tbNombreCono.Text != "")
            {
                btnInsertarCono.PerformClick();
            }
        }

        private void btnEliminarCono_Click(object sender, EventArgs e)
        {
            ObjetoCono ocNuevo = (ObjetoCono)datosProyecto.getObjeto(tbNombreCono.Text, 3);
            if (ocNuevo != null)
            {
                datosProyecto.setBorrarObjetoArray(tbNombreCono.Text, 3);
                cargarItemsEnListaCono();
                limpiarPestañaCono();
            }
        }

        private void btnInsertarCono_Click(object sender, EventArgs e)
        {
            //Aquí no se que controlar para cuando presione insertar que se genere, porque son muchos campos...
            Boolean nuevo = true;
            ObjetoCono oc;
            if (tbNombreCono.Text != "")
            {
                oc = (ObjetoCono)datosProyecto.getObjeto(tbNombreCono.Text, 3);
                if (oc != null)
                {                    
                    nuevo = false;
                }
                else
                {
                    oc = new ObjetoCono(decimal.ToSingle(numAltoCono.Value), decimal.ToSingle(numRadioCono.Value));
                    contadorCono++;
                    oc.NombreObjeto = tbNombreCono.Text;
                }
            }
            else
            {
                oc = new ObjetoCono(decimal.ToSingle(numAltoCono.Value), decimal.ToSingle(numRadioCono.Value), contadorCono);
                contadorCono++;
            }
            oc.Altura = decimal.ToSingle(numAltoCono.Value);
            oc.Radio = decimal.ToSingle(numRadioCono.Value);
            oc.setPosicion(decimal.ToSingle(numPosXCono.Value), decimal.ToSingle(numPosYCono.Value), decimal.ToSingle(numPosZCono.Value));
            if (rotacionXCono.Checked)
            {
                oc.EjeDeRotacion = 'X';
            }
            else if (rotacionYCono.Checked)
            {
                oc.EjeDeRotacion = 'Y';
            }
            else if (rotacionZCono.Checked)
            {
                oc.EjeDeRotacion = 'Z';
            }
            oc.AnguloRotacion = decimal.ToSingle(numRotacionCono.Value);
            oc.setEscala(decimal.ToSingle(numEscalaXCono.Value), decimal.ToSingle(numEscalaYCono.Value), decimal.ToSingle(numEscalaZCono.Value));
            if (opcionColorCono.Checked)
            {
                oc.setColorObjeto(colorObjeto.R, colorObjeto.G, colorObjeto.B);
                oc.setColorReflejado(colorReflejado.R, colorReflejado.G, colorReflejado.B);
                oc.setColorInterior(colorInterior.R, colorInterior.G, colorInterior.B);
                oc.Imagen = "";
                imagenCono = "";
            }
            else if (opcionImagenCono.Checked)
            {
                oc.Imagen = tbImagenCono.Text;
            }
            oc.ReflejoLuz = decimal.ToSingle(numReflejoLuzCono.Value);
            oc.Brillo = decimal.ToSingle(numBrilloCono.Value);
            oc.Transparencia = decimal.ToSingle(numTransparenciaCono.Value);
            if (nuevo)
            {
                datosProyecto.setIntroducirObjetos(oc);
            }
            cargarItemsEnListaCono();
            limpiarPestañaCono();
            TabControl tc = controlPestañas;            
        }


        //Botones color
        // Voy a hacer la comida y tal, a ver si luego me pongo e implemento esto, me hacen falta unas variables mateo para el color
        // asi que ponlas globales para luego insertarlas.
        private void btnColorCono_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorObjeto = new Color();
                colorObjeto = colorDialog1.Color;
                lblColorCono.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorObjeto != null)
                {
                    lblColorCono.BackColor = colorObjeto;
                }
                else
                {
                    lblColorCono.BackColor = Color.White;
                }
            }
        }

        private void btnColorInteriorCono_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorInterior = new Color();
                colorInterior = colorDialog1.Color;
                lblColorInteriorCono.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorInterior != null)
                {
                    lblColorInteriorCono.BackColor = colorInterior;
                }
                else
                {
                    lblColorInteriorCono.BackColor = Color.White;
                }
            }
        }

        private void btnColorObjetoCono_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorReflejado = new Color();
                colorReflejado = colorDialog1.Color;
                lblColorReflejadoCono.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorReflejado != null)
                {
                    lblColorReflejadoCono.BackColor = colorReflejado;
                }
                else
                {
                    lblColorReflejadoCono.BackColor = Color.White;
                }
            }
        }

        //Boton Imagen
        private void btnExaminarCono_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Ficheros JPG|*.jpg";
            openFileDialog1.ShowDialog();
            if (openFileDialog1.FileName != "")
            {
                try
                {
                    // Si queremos, se pueden redimensionar las imagenes a lo que nosotros digamos.
                    Bitmap imagen = new Bitmap(Image.FromFile(openFileDialog1.FileName), 126, 126);
                    lblImagenCono.Image = imagen;
                    tbImagenCono.Text = openFileDialog1.FileName;
                    imagenCono = openFileDialog1.FileName;
                }
                catch
                {
                    lblImagenCono.Text = "Error al cargar la imagen.";
                }
            }
        }      

        private void listaObjetosCono_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                tbNombreCono.Text = listaObjetosCono.SelectedItems[0].SubItems[1].Text;
                ObjetoCono objeto = (ObjetoCono)datosProyecto.getObjeto(listaObjetosCono.SelectedItems[0].SubItems[1].Text, 3);
                numAltoCono.Value = (decimal)objeto.Altura;
                numRadioCono.Value = (decimal)objeto.Radio;
                float[] medidas = objeto.getPosicion();
                numPosXCono.Value = (decimal)medidas[0];
                numPosYCono.Value = (decimal)medidas[1];
                numPosZCono.Value = (decimal)medidas[2];
                switch (objeto.EjeDeRotacion)
                {
                    case 'X':
                        rotacionXCono.Checked = true;
                        break;
                    case 'Y':
                        rotacionYCono.Checked = true;
                        break;
                    case 'Z':
                        rotacionZCono.Checked = true;
                        break;
                }
                numRotacionCono.Value = (decimal)objeto.AnguloRotacion;
                medidas = objeto.getEscala();
                numEscalaXCono.Value = (decimal)medidas[0];
                numEscalaYCono.Value = (decimal)medidas[1];
                numEscalaZCono.Value = (decimal)medidas[2];
                if (!objeto.Imagen.Equals(""))
                {
                    opcionImagenCono.Checked = true;
                    tbImagenCono.Text = objeto.Imagen;
                    Bitmap imagen = new Bitmap(Image.FromFile(objeto.Imagen), 126, 126);
                    lblImagenCono.Image = imagen;
                    imagenCono = objeto.Imagen;
                }
                else
                {
                    opcionColorCono.Checked = true;
                    int[] colores = objeto.getColorObjeto();
                    Color colorObjeto = Color.FromArgb(colores[0], colores[1], colores[2]);
                    colores = objeto.getColorInterior();
                    Color colorInterior = Color.FromArgb(colores[0], colores[1], colores[2]);
                    colores = objeto.getColorReflejado();
                    Color colorReflejado = Color.FromArgb(colores[0], colores[1], colores[2]);
                    lblColorCono.BackColor = colorObjeto;
                    lblColorInteriorCono.BackColor = colorInterior;
                    lblColorReflejadoCono.BackColor = colorReflejado;
                }
                numReflejoLuzCono.Value = (decimal)objeto.ReflejoLuz;
                numBrilloCono.Value = (decimal)objeto.Brillo;
                numTransparenciaCono.Value = (decimal)objeto.Transparencia;
            }
            catch
            {
            }
        }

        private void btnLimpiarCamposCono_Click(object sender, EventArgs e)
        {
            limpiarPestañaCono();
        }
        #endregion

        #region eventosPestañaEsfera
        private void opcionColorEsfera_CheckedChanged(object sender, EventArgs e)
        {
            if (opcionColorEsfera.Checked)
            {
                tbImagenEsfera.Visible = false;
                btnExaminarEsfera.Visible = false;
                btnColorEsfera.Visible = true;
                lblColorEsfera.Visible = true;
                lblImagenEsfera.Visible = false;
                lblColorInteriorEsfera.Visible = true;
                lblColorReflejadoEsfera.Visible = true;
                btnColorObjetoEsfera.Visible = true;
                btnColorInteriorEsfera.Visible = true;
                lblReflejoLuzEsfera.Visible = true;
                lblBrilloEsfera.Visible = true;
                numReflejoLuzEsfera.Visible = true;
                numBrilloEsfera.Visible = true;
            }
            else
            {
                tbImagenEsfera.Visible = true;
                btnExaminarEsfera.Visible = true;
                btnColorEsfera.Visible = false;
                lblColorEsfera.Visible = false;
                lblImagenEsfera.Visible = true;
                lblColorInteriorEsfera.Visible = false;
                lblColorReflejadoEsfera.Visible = false;
                btnColorObjetoEsfera.Visible = false;
                btnColorInteriorEsfera.Visible = false;
                lblReflejoLuzEsfera.Visible = false;
                lblBrilloEsfera.Visible = false;
                numReflejoLuzEsfera.Visible = false;
                numBrilloEsfera.Visible = false;
                tbImagenEsfera.Text = imagenEsfera;
                try
                {
                    Bitmap imagen = new Bitmap(Image.FromFile(imagenEsfera), 126, 126);
                    lblImagenEsfera.Image = imagen;
                }
                catch
                {
                }
            }
        }

        private void cargarItemsEnListaEsfera()
        {
            //ListViewItem lvi = new ListViewItem(new[] { "1", "prueba", "Esfera" });
            //listaObjetosEsfera.Items.Add(lvi);            
            listaObjetosEsfera.Items.Clear();
            ArrayList objetos = datosProyecto.getObjeto(4);
            for (int i = 0; i < objetos.Count; i++)
            {
                ObjetoEsfera oc = (ObjetoEsfera)objetos[i];
                ListViewItem lvi = new ListViewItem(new[] { i + 1 + "", oc.NombreObjeto, "Esfera" });
                listaObjetosEsfera.Items.Add(lvi);
            }
        }

        private void limpiarPestañaEsfera()
        {
            tbNombreEsfera.Text = "";
            numRadioEsfera.Value = numPosXEsfera.Value = numPosYEsfera.Value = numPosZEsfera.Value = numRotacionEsfera.Value = 0;
            numReflejoLuzEsfera.Value = numBrilloEsfera.Value = numTransparenciaEsfera.Value = 0;
            lblColorEsfera.BackColor = lblColorInteriorEsfera.BackColor = lblColorReflejadoEsfera.BackColor = lblImagenEsfera.BackColor = Color.Transparent;
            lblImagenEsfera.Image = null;
        }

        private void btnModificarEsfera_Click(object sender, EventArgs e)
        {
            if (tbNombreEsfera.Text != "")
            {
                btnInsertarEsfera.PerformClick();
            }
        }

        private void btnEliminarEsfera_Click(object sender, EventArgs e)
        {
            ObjetoEsfera ocNuevo = (ObjetoEsfera)datosProyecto.getObjeto(tbNombreEsfera.Text, 4);
            if (ocNuevo != null)
            {
                datosProyecto.setBorrarObjetoArray(tbNombreEsfera.Text, 4);
                cargarItemsEnListaEsfera();
                limpiarPestañaEsfera();
            }
        }

        private void btnInsertarEsfera_Click(object sender, EventArgs e)
        {
            //Aquí no se que controlar para cuando presione insertar que se genere, porque son muchos campos...
            Boolean nuevo = true;
            ObjetoEsfera oc;
            if (tbNombreEsfera.Text != "")
            {
                oc = (ObjetoEsfera)datosProyecto.getObjeto(tbNombreEsfera.Text, 4);
                if (oc != null)
                {                    
                    nuevo = false;
                }
                else
                {
                    oc = new ObjetoEsfera(decimal.ToSingle(numRadioEsfera.Value));
                    contadorEsfera++;
                    oc.NombreObjeto = tbNombreEsfera.Text;
                }
            }
            else
            {
                oc = new ObjetoEsfera(decimal.ToSingle(numRadioEsfera.Value), contadorEsfera);
                contadorEsfera++;
            }
            oc.Radio = decimal.ToSingle(numRadioEsfera.Value);
            oc.setPosicion(decimal.ToSingle(numPosXEsfera.Value), decimal.ToSingle(numPosYEsfera.Value), decimal.ToSingle(numPosZEsfera.Value));
            if (rotacionXEsfera.Checked)
            {
                oc.EjeDeRotacion = 'X';
            }
            else if (rotacionYEsfera.Checked)
            {
                oc.EjeDeRotacion = 'Y';
            }
            else if (rotacionZEsfera.Checked)
            {
                oc.EjeDeRotacion = 'Z';
            }
            oc.AnguloRotacion = decimal.ToSingle(numRotacionEsfera.Value);
            oc.setEscala(decimal.ToSingle(numEscalaXEsfera.Value), decimal.ToSingle(numEscalaYEsfera.Value), decimal.ToSingle(numEscalaZEsfera.Value));
            if (opcionColorEsfera.Checked)
            {
                oc.setColorObjeto(colorObjeto.R, colorObjeto.G, colorObjeto.B);
                oc.setColorReflejado(colorReflejado.R, colorReflejado.G, colorReflejado.B);
                oc.setColorInterior(colorInterior.R, colorInterior.G, colorInterior.B);
                oc.Imagen = "";
                imagenEsfera = "";
            }
            else if (opcionImagenEsfera.Checked)
            {
                oc.Imagen = tbImagenEsfera.Text;
            }
            oc.ReflejoLuz = decimal.ToSingle(numReflejoLuzEsfera.Value);
            oc.Brillo = decimal.ToSingle(numBrilloEsfera.Value);
            oc.Transparencia = decimal.ToSingle(numTransparenciaEsfera.Value);
            if (nuevo)
            {
                datosProyecto.setIntroducirObjetos(oc);
            }
            cargarItemsEnListaEsfera();
            limpiarPestañaEsfera();
            TabControl tc = controlPestañas;            
        }


        //Botones color
        // Voy a hacer la comida y tal, a ver si luego me pongo e implemento esto, me hacen falta unas variables mateo para el color
        // asi que ponlas globales para luego insertarlas.
        private void btnColorEsfera_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorObjeto = new Color();
                colorObjeto = colorDialog1.Color;
                lblColorEsfera.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorObjeto != null)
                {
                    lblColorEsfera.BackColor = colorObjeto;
                }
                else
                {
                    lblColorEsfera.BackColor = Color.White;
                }
            }
        }

        private void btnColorInteriorEsfera_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorInterior = new Color();
                colorInterior = colorDialog1.Color;
                lblColorInteriorEsfera.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorInterior != null)
                {
                    lblColorInteriorEsfera.BackColor = colorInterior;
                }
                else
                {
                    lblColorInteriorEsfera.BackColor = Color.White;
                }
            }
        }

        private void btnColorObjetoEsfera_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                colorReflejado = new Color();
                colorReflejado = colorDialog1.Color;
                lblColorReflejadoEsfera.BackColor = colorDialog1.Color;
            }
            else
            {
                if (colorReflejado != null)
                {
                    lblColorReflejadoEsfera.BackColor = colorReflejado;
                }
                else
                {
                    lblColorReflejadoEsfera.BackColor = Color.White;
                }
            }
        }

        //Boton Imagen
        private void btnExaminarEsfera_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Ficheros JPG|*.jpg";
            openFileDialog1.ShowDialog();
            if (openFileDialog1.FileName != "")
            {
                try
                {
                    // Si queremos, se pueden redimensionar las imagenes a lo que nosotros digamos.
                    Bitmap imagen = new Bitmap(Image.FromFile(openFileDialog1.FileName), 126, 126);
                    lblImagenEsfera.Image = imagen;
                    tbImagenEsfera.Text = openFileDialog1.FileName;
                    imagenEsfera = openFileDialog1.FileName;
                }
                catch
                {
                    lblImagenEsfera.Text = "Error al cargar la imagen.";
                }
            }
        }        

        private void listaObjetosEsfera_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                tbNombreEsfera.Text = listaObjetosEsfera.SelectedItems[0].SubItems[1].Text;
                ObjetoEsfera objeto = (ObjetoEsfera)datosProyecto.getObjeto(listaObjetosEsfera.SelectedItems[0].SubItems[1].Text, 4);
                numRadioEsfera.Value = (decimal)objeto.Radio;
                float[] medidas = objeto.getPosicion();
                numPosXEsfera.Value = (decimal)medidas[0];
                numPosYEsfera.Value = (decimal)medidas[1];
                numPosZEsfera.Value = (decimal)medidas[2];
                switch (objeto.EjeDeRotacion)
                {
                    case 'X':
                        rotacionXEsfera.Checked = true;
                        break;
                    case 'Y':
                        rotacionYEsfera.Checked = true;
                        break;
                    case 'Z':
                        rotacionZEsfera.Checked = true;
                        break;
                }
                numRotacionEsfera.Value = (decimal)objeto.AnguloRotacion;
                medidas = objeto.getEscala();
                numEscalaXEsfera.Value = (decimal)medidas[0];
                numEscalaYEsfera.Value = (decimal)medidas[1];
                numEscalaZEsfera.Value = (decimal)medidas[2];
                if (!objeto.Imagen.Equals(""))
                {
                    opcionImagenEsfera.Checked = true;
                    tbImagenEsfera.Text = objeto.Imagen;
                    Bitmap imagen = new Bitmap(Image.FromFile(objeto.Imagen), 126, 126);
                    lblImagenEsfera.Image = imagen;
                    imagenEsfera = objeto.Imagen;
                }
                else
                {
                    opcionColorEsfera.Checked = true;
                    int[] colores = objeto.getColorObjeto();
                    Color colorObjeto = Color.FromArgb(colores[0], colores[1], colores[2]);
                    colores = objeto.getColorInterior();
                    Color colorInterior = Color.FromArgb(colores[0], colores[1], colores[2]);
                    colores = objeto.getColorReflejado();
                    Color colorReflejado = Color.FromArgb(colores[0], colores[1], colores[2]);
                    lblColorEsfera.BackColor = colorObjeto;
                    lblColorInteriorEsfera.BackColor = colorInterior;
                    lblColorReflejadoEsfera.BackColor = colorReflejado;
                }
                numReflejoLuzEsfera.Value = (decimal)objeto.ReflejoLuz;
                numBrilloEsfera.Value = (decimal)objeto.Brillo;
                numTransparenciaEsfera.Value = (decimal)objeto.Transparencia;
            }
            catch
            {
            }
        }

        private void btnLimpiarCamposEsfera_Click(object sender, EventArgs e)
        {
            limpiarPestañaEsfera();
        }
        #endregion

        #region eventosPanelFicheros3D

        private void btnExaminarFicheros3D_Click(object sender, EventArgs e)
        {
            openFileDialog1.InitialDirectory = "C:";
            openFileDialog1.Filter = "Ficheros WRL|*.wrl";
            openFileDialog1.ShowDialog();
            if (openFileDialog1.FileName != "")
            {
                txtRutaFichero3dExterno.Text = openFileDialog1.FileName;
            }
        }

        private void btnInsertarFichero3D_Click(object sender, EventArgs e)
        {
            if (txtRutaFichero3dExterno.Text != "")
            {
                if (txtNombreFichero3D.Text != "")
                {
                    if (datosProyecto.getObjeto(txtNombreFichero3D.Text, 5) == null) //El objeto no existe si el método devuelve null
                    {
                        ObjetoFicheroExterno fichero = new ObjetoFicheroExterno(txtRutaFichero3dExterno.Text);
                        fichero.setPosicion(decimal.ToSingle(numXPosicionFichero3D.Value), decimal.ToSingle(numYPosicionFichero3D.Value), decimal.ToSingle(numZPosicionFichero3D.Value));
                        fichero.NombreObjeto = txtNombreFichero3D.Text.ToUpper();
                        datosProyecto.setIntroducirObjetos(fichero);
                        cargarItemsEnLista(listaFicheros, 5);
                        txtNombreFichero3D.Text = "";
                        txtRutaFichero3dExterno.Text = "";
                        numXPosicionFichero3D.Value = 0;
                        numXPosicionFichero3D.Value = 0;
                        numXPosicionFichero3D.Value = 0;
                    }
                    else
                    {
                        MessageBox.Show("El nombre del fichero ya existe, hay que introducir uno diferente.", "Nombre repetido", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txtNombreFichero3D.Focus();
                    }
                }
                else
                {
                    ObjetoFicheroExterno fichero = new ObjetoFicheroExterno(txtRutaFichero3dExterno.Text, contadorFichero);
                    fichero.setPosicion(decimal.ToSingle(numXPosicionFichero3D.Value), decimal.ToSingle(numYPosicionFichero3D.Value), decimal.ToSingle(numZPosicionFichero3D.Value));
                    datosProyecto.setIntroducirObjetos(fichero);
                    cargarItemsEnLista(listaFicheros, 5);
                    txtNombreFichero3D.Text = "";
                    txtRutaFichero3dExterno.Text = "";
                    numXPosicionFichero3D.Value = 0;
                    numXPosicionFichero3D.Value = 0;
                    numXPosicionFichero3D.Value = 0;
                    contadorFichero++;
                }
            }
            else
            {
                MessageBox.Show("La ruta del fichero externo es obligatoria.", "Falta Información", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtRutaFichero3dExterno.Focus();
            }
        }

        private void btnModificarFichero3D_Click(object sender, EventArgs e)
        {
            if (listaFicheros.SelectedItems.Count > 0)
            {
                if (txtRutaFichero3dExterno.Text != "")
                {
                    if (txtNombreFichero3D.Text != "")
                    {
                        if (txtNombreFichero3D.Text != listaFicheros.SelectedItems[0].SubItems[1].Text)
                        {
                            if (datosProyecto.getObjetosRepetidos(txtNombreFichero3D.Text, 5) == 0)
                            {
                                ObjetoFicheroExterno fichero = (ObjetoFicheroExterno)datosProyecto.getObjeto(listaFicheros.SelectedItems[0].SubItems[1].Text, 5);
                                fichero.setPosicion(decimal.ToSingle(numXPosicionFichero3D.Value), decimal.ToSingle(numYPosicionFichero3D.Value), decimal.ToSingle(numZPosicionFichero3D.Value));
                                fichero.NombreObjeto = txtNombreFichero3D.Text.ToUpper();
                                fichero.RutaFichero = txtRutaFichero3dExterno.Text;
                                cargarItemsEnLista(listaFicheros, 5);
                                txtNombreFichero3D.Text = "";
                                txtRutaFichero3dExterno.Text = "";
                                numXPosicionFichero3D.Value = 0;
                                numYPosicionFichero3D.Value = 0;
                                numZPosicionFichero3D.Value = 0;
                            }
                            else
                            {
                                MessageBox.Show("El nombre de fichero ya está en uso, hay que usar uno diferente.", "Nombre fichero", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                txtNombreFichero3D.Focus();
                            }
                        }
                        else
                        {
                            ObjetoFicheroExterno fichero = (ObjetoFicheroExterno)datosProyecto.getObjeto(listaFicheros.SelectedItems[0].SubItems[1].Text, 5);
                            fichero.setPosicion(decimal.ToSingle(numXPosicionFichero3D.Value), decimal.ToSingle(numYPosicionFichero3D.Value), decimal.ToSingle(numZPosicionFichero3D.Value));
                            fichero.RutaFichero = txtRutaFichero3dExterno.Text;
                            cargarItemsEnLista(listaFicheros, 5);
                            txtNombreFichero3D.Text = "";
                            txtRutaFichero3dExterno.Text = "";
                            numXPosicionFichero3D.Value = 0;
                            numYPosicionFichero3D.Value = 0;
                            numZPosicionFichero3D.Value = 0;
                        }
                    }
                    else
                    {
                        MessageBox.Show("El nombre de fichero es obligatorio.", "Nombre fichero", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txtNombreFichero3D.Focus();
                    }
                }
                else
                {
                    MessageBox.Show("La ruta del fichero externo es obligatoria.", "Falta Información", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txtRutaFichero3dExterno.Focus();
                }
            }
            else
            {
                MessageBox.Show("No se ha seleccionado el objeto a modificar.", "Selección", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void btnEliminarFichero3D_Click(object sender, EventArgs e)
        {
            if (listaFicheros.SelectedItems.Count > 0)
            {
                datosProyecto.setBorrarObjetoArray(listaFicheros.SelectedItems[0].SubItems[1].Text, 5);
                cargarItemsEnLista(listaFicheros, 5);
                txtNombreFichero3D.Text = "";
                txtRutaFichero3dExterno.Text = "";
                numXPosicionFichero3D.Value = 0;
                numYPosicionFichero3D.Value = 0;
                numZPosicionFichero3D.Value = 0;
            }
            else
            {
                MessageBox.Show("No se ha seleccionado el objeto a borrar.", "Selección", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void listaFicheros_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                txtNombreFichero3D.Text = listaFicheros.SelectedItems[0].SubItems[1].Text;
                txtRutaFichero3dExterno.Text = listaFicheros.SelectedItems[0].SubItems[2].Text; ;
                ObjetoFicheroExterno objeto = (ObjetoFicheroExterno)datosProyecto.getObjeto(listaFicheros.SelectedItems[0].SubItems[1].Text, 5);
                float[] posicion = objeto.getPosicion();
                numXPosicionFichero3D.Value = (decimal)posicion[0];
                numYPosicionFichero3D.Value = (decimal)posicion[1];
                numZPosicionFichero3D.Value = (decimal)posicion[2];
            }
            catch
            {
                txtRutaFichero3dExterno.Text = "";
                txtNombreFichero3D.Text = "";
            }

        }

        #endregion eventosPanelFicheros3D

        #region eventosPanelCielo

        private void btnGuardarCielo_Click(object sender, EventArgs e)
        {
            ObjetoCieloSuelo cieloSuelo = (ObjetoCieloSuelo)datosProyecto.getObjeto("", 7);
            cieloSuelo.AnguloCielo = decimal.ToSingle(numAnguloCielo.Value);
            cieloSuelo.setColorCieloEsfera(lblColorCieloSuperior.BackColor.R, lblColorCieloSuperior.BackColor.G, lblColorCieloSuperior.BackColor.B);
            cieloSuelo.setColorCieloHorizonte(lblColorCieloHorizonte.BackColor.R, lblColorCieloHorizonte.BackColor.G, lblColorCieloHorizonte.BackColor.B);
        }

        private void btnColorCieloSuperior_Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
            lblColorCieloSuperior.BackColor = colorDialog1.Color;
        }

        private void btnColorCieloHorizonte_Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
            lblColorCieloHorizonte.BackColor = colorDialog1.Color;
        }

        private void btnEliminarColorCielo_Click(object sender, EventArgs e)
        {
            ObjetoCieloSuelo cieloSuelo = (ObjetoCieloSuelo)datosProyecto.getObjeto("", 7);
            cieloSuelo.AnguloCielo = 0;
            cieloSuelo.setColorCieloEsfera(0, 0, 0);
            cieloSuelo.setColorCieloHorizonte(0, 0, 0);
            numAnguloCielo.Value = 0;
            lblColorCieloSuperior.BackColor = System.Drawing.Color.FromArgb(0, 0, 0);
            lblColorCieloHorizonte.BackColor = System.Drawing.Color.FromArgb(0, 0, 0);
        }

        #endregion

        #region eventosPanelSuelo
        private void btnColorSueloInferior_Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
            lblColorSuelo.BackColor = colorDialog1.Color;
        }

        private void btnColorSueloHorizonte_Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
            lblColorSueloHorizonte.BackColor = colorDialog1.Color;
        }

        private void btnGuardarColorSuelo_Click(object sender, EventArgs e)
        {
            ObjetoCieloSuelo suelo = (ObjetoCieloSuelo)datosProyecto.getObjeto("", 7);
            suelo.AnguloSuelo = decimal.ToSingle(numAnguloColorSuelo.Value);
            suelo.setColorSueloEsfera(lblColorSuelo.BackColor.R, lblColorSuelo.BackColor.G, lblColorSuelo.BackColor.B);
            suelo.setColorSueloHorizonte(lblColorSueloHorizonte.BackColor.R, lblColorSueloHorizonte.BackColor.G, lblColorSueloHorizonte.BackColor.B);
        }

        private void btnEliminarColorSuelo_Click(object sender, EventArgs e)
        {
            ObjetoCieloSuelo suelo = (ObjetoCieloSuelo)datosProyecto.getObjeto("", 7);
            suelo.AnguloSuelo = 0;
            suelo.setColorSueloEsfera(0, 0, 0);
            suelo.setColorSueloHorizonte(0, 0, 0);
            numAnguloColorSuelo.Value = 0;
            lblColorSuelo.BackColor = System.Drawing.Color.FromArgb(0, 0, 0);
            lblColorSueloHorizonte.BackColor = System.Drawing.Color.FromArgb(0, 0, 0);
        }
        #endregion

        #region eventosPanelNiebla

        private void btnColorNiebla_Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
            lblColorNiebla.BackColor = colorDialog1.Color;
        }

        private void btnGuardarNiebla_Click(object sender, EventArgs e)
        {
            if ((ObjetoNiebla)datosProyecto.getObjeto("", 6) == null)
            {
                if (rdbExponencial.Checked)
                {
                    ObjetoNiebla niebla = new ObjetoNiebla(lblColorNiebla.BackColor.R, lblColorNiebla.BackColor.G, lblColorNiebla.BackColor.B, 'E', decimal.ToSingle(numDistanciaNiebla.Value));
                    datosProyecto.setIntroducirObjetos(niebla);
                }
                else
                {
                    ObjetoNiebla niebla = new ObjetoNiebla(lblColorNiebla.BackColor.R, lblColorNiebla.BackColor.G, lblColorNiebla.BackColor.B, 'L', decimal.ToSingle(numDistanciaNiebla.Value));
                    datosProyecto.setIntroducirObjetos(niebla);
                }

            }
            else
            {
                ObjetoNiebla niebla = (ObjetoNiebla)datosProyecto.getObjeto("", 6);
                niebla.Visibilidad = decimal.ToSingle(numDistanciaNiebla.Value);
                niebla.setColor(lblColorNiebla.BackColor.R, lblColorNiebla.BackColor.G, lblColorNiebla.BackColor.B);
                if (rdbExponencial.Checked)
                {
                    niebla.TipoNiebla = 'E';
                }
                else
                {
                    niebla.TipoNiebla = 'L';
                }
            }
        }

        private void btnEliminarNiebla_Click(object sender, EventArgs e)
        {
            datosProyecto.setBorrarObjetoArray("", 6);
            numDistanciaNiebla.Value = 0;
            lblColorNiebla.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);
            rdbExponencial.Select();
        }

        #endregion

        #region eventos panelPanorama

        private void btnImagenTraseraPanorama_Click(object sender, EventArgs e)
        {
            Image imagen;
            try
            {
                String ruta = cargarImagen();
                if (ruta != "")
                {
                    imagen = new Bitmap(Image.FromFile(ruta), 150, 150);
                    lblImagenTraseraPanorama.Image = imagen;
                    imagenTraseraPanorama = ruta;
                }
                else
                {
                    MessageBox.Show("No se ha indicado ningún archivo de imagen.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch
            {
                MessageBox.Show("Archivo de imagen no válido.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void btnImagenSuperiorPanorama_Click(object sender, EventArgs e)
        {
            Image imagen;
            try
            {
                String ruta = cargarImagen();
                if (ruta != "")
                {
                    imagen = new Bitmap(Image.FromFile(ruta), 150, 150);
                    lblImagenSuperiorPanorama.Image = imagen;
                    imagenSuperiorPanorama = ruta;
                }
                else
                {
                    MessageBox.Show("No se ha indicado ningún archivo de imagen.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch
            {
                MessageBox.Show("Archivo de imagen no válido.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

        }

        private void btnImagenDerechaPanorama_Click(object sender, EventArgs e)
        {
            Image imagen;
            try
            {
                String ruta = cargarImagen();
                if (ruta != "")
                {
                    imagen = new Bitmap(Image.FromFile(ruta), 150, 150);
                    lblImagenDerechaPanorama.Image = imagen;
                    imagenDerechaPanorama = ruta;
                }
                else
                {
                    MessageBox.Show("No se ha indicado ningún archivo de imagen.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch
            {
                MessageBox.Show("Archivo de imagen no válido.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

        }

        private void btnImagenFrontalPanorama_Click(object sender, EventArgs e)
        {
            Image imagen;
            try
            {
                String ruta = cargarImagen();
                if (ruta != "")
                {
                    imagen = new Bitmap(Image.FromFile(ruta), 150, 150);
                    lblImagenFrontalPanorama.Image = imagen;
                    imagenFrontalPanorama = ruta;
                }
                else
                {
                    MessageBox.Show("No se ha indicado ningún archivo de imagen.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch
            {
                MessageBox.Show("Archivo de imagen no válido.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

        }

        private void btnImagenInferiorPanorama_Click(object sender, EventArgs e)
        {
            Image imagen;
            try
            {
                String ruta = cargarImagen();
                if (ruta != "")
                {
                    imagen = new Bitmap(Image.FromFile(ruta), 150, 150);
                    lblImagenInferiorPanorama.Image = imagen;
                    imagenInferiorPanorama = ruta;
                }
                else
                {
                    MessageBox.Show("No se ha indicado ningún archivo de imagen.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch
            {
                MessageBox.Show("Archivo de imagen no válido.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

        }

        private void btnImagenIzquierdaPanorama_Click(object sender, EventArgs e)
        {
            Image imagen;
            try
            {
                String ruta = cargarImagen();
                if (ruta != "")
                {
                    imagen = new Bitmap(Image.FromFile(ruta), 150, 150);
                    lblImagenIzquierdaPanorama.Image = imagen;
                    imagenIzquierdaPanorama = ruta;
                }
                else
                {
                    MessageBox.Show("No se ha indicado ningún archivo de imagen.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch
            {
                MessageBox.Show("Archivo de imagen no válido.", "Archivo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

        }

        private void btnGuardarPanorama_Click(object sender, EventArgs e)
        {
            if (datosProyecto.getObjeto("", 8) != null)
            {
                ObjetoPanorama panorama = (ObjetoPanorama)datosProyecto.getObjeto("", 8);
                panorama.ImagenArriba = imagenSuperiorPanorama;
                panorama.ImagenAbajo = imagenInferiorPanorama;
                panorama.ImagenFrontal = imagenFrontalPanorama;
                panorama.ImagenTrasera = imagenTraseraPanorama;
                panorama.ImagenDerecha = imagenDerechaPanorama;
                panorama.ImagenIzquierda = imagenIzquierdaPanorama;
            }
            else
            {
                ObjetoPanorama panorama = new ObjetoPanorama();
                panorama.ImagenArriba = imagenSuperiorPanorama;
                panorama.ImagenAbajo = imagenInferiorPanorama;
                panorama.ImagenFrontal = imagenFrontalPanorama;
                panorama.ImagenTrasera = imagenTraseraPanorama;
                panorama.ImagenDerecha = imagenDerechaPanorama;
                panorama.ImagenIzquierda = imagenIzquierdaPanorama;
                datosProyecto.setIntroducirObjetos(panorama);
            }
        }

        private void btnEliminarPanorama_Click(object sender, EventArgs e)
        {
            datosProyecto.setBorrarObjetoArray("", 8);
            lblImagenFrontalPanorama.Image = null;
            lblImagenTraseraPanorama.Image = null;
            lblImagenSuperiorPanorama.Image = null;
            lblImagenInferiorPanorama.Image = null;
            lblImagenIzquierdaPanorama.Image = null;
            lblImagenDerechaPanorama.Image = null;
        }

        #endregion

        private void acercaDeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            String informacion = "3DVRML \nVersión 1.0 \n\nAplicación para crear mundos virtuales con figuras 3D.\n\nDesarrollada por: \nMarcos Pérez Rubio \nJuan Ramón Martínez \nMateo Fernández Fuentes\n2º DAI I.E.S. Ginés Pérez Chirinos";
            MessageBox.Show(informacion, "Informacion sobre 3DVRML v1.0", MessageBoxButtons.OK);
        }

        private void aplicaciónToolStripMenuItem_Click(object sender, EventArgs e)
        {   
            byte[] arrayByte = CreatingObjects3d.Properties.Resources.ayuda_crear_objetos_vrml;
            FileStream archivoSalida = new FileStream(Application.StartupPath + "\\ayudaCrearObjetos.chm", FileMode.Create);
            archivoSalida.Write(arrayByte, 0, arrayByte.Length);
            archivoSalida.Close();
            System.Diagnostics.Process.Start(Application.StartupPath + "\\ayudaCrearObjetos.chm");           
        }        
    }
}
